home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ARPSUBR.C < prev    next >
C/C++ Source or Header  |  1990-03-14  |  2KB  |  71 lines

  1. /* Address Resolution Protocol (ARP) low-level functions
  2.  */
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "timer.h"
  6. #include "iface.h"
  7. #include "enet.h"
  8. #include "ax25.h"
  9. #include "arp.h"
  10.  
  11. /* Copy a host format arp structure into mbuf for transmission */
  12. struct mbuf *
  13. htonarp(arp)
  14. register struct arp *arp;
  15. {
  16.     struct mbuf *bp;
  17.     register char *buf;
  18.     char addrbuf[4];
  19.  
  20.     if(arp == (struct arp *)NULL)
  21.         return NULLBUF;
  22.     if((bp = alloc_mbuf(16 + 2 * arp->hwalen)) == NULLBUF)
  23.         return NULLBUF;
  24.  
  25.     buf = bp->data;
  26.  
  27.     buf = put16(buf,arp->hardware);
  28.     buf = put16(buf,arp->protocol);
  29.     *buf++ = arp->hwalen;
  30.     *buf++ = arp->pralen;
  31.     buf = put16(buf,arp->opcode);
  32.     memcpy(buf,arp->shwaddr,(int16)uchar(arp->hwalen));
  33.     buf += arp->hwalen;
  34.     put32(addrbuf,arp->sprotaddr);
  35.     memcpy(buf,addrbuf,4);
  36.     buf += 4;
  37.     memcpy(buf,arp->thwaddr,(int16)uchar(arp->hwalen));
  38.     buf += arp->hwalen;
  39.     put32(addrbuf,arp->tprotaddr);
  40.     memcpy(buf,addrbuf,4);
  41.     buf += 4;
  42.  
  43.     bp->cnt = buf - bp->data;
  44.     return bp;
  45. }
  46. /* Convert an incoming ARP packet into a host-format structure */
  47. int
  48. ntoharp(arp,bpp)
  49. register struct arp *arp;
  50. struct mbuf **bpp;
  51. {
  52.     if(arp == (struct arp *)NULL || bpp == NULLBUFP)
  53.         return -1;
  54.  
  55.     arp->hardware = pull16(bpp);
  56.     arp->protocol = pull16(bpp);
  57.     arp->hwalen = pullchar(bpp);
  58.     arp->pralen = pullchar(bpp);
  59.     arp->opcode = pull16(bpp);
  60.     pullup(bpp,arp->shwaddr,(int16)uchar(arp->hwalen));
  61.     arp->sprotaddr = pull32(bpp);
  62.     pullup(bpp,arp->thwaddr,(int16)uchar(arp->hwalen));
  63.  
  64.     arp->tprotaddr = pull32(bpp);
  65.  
  66.     /* Get rid of anything left over */
  67.     free_p(*bpp);
  68.     *bpp = NULLBUF;
  69.     return 0;
  70. }
  71.